#!/usr/bin/env lua
-- 清理日志文件的Lua程序
-- 遵循便携版设计，使用HOME环境变量定位根目录

-- 规范化路径分隔符 - 使用正斜杠以兼容SH终端
local function normalize_path(path)
    return path:gsub("\\", "/")
end

-- 确定根目录
local root_dir

-- 在Git Bash环境中，优先使用PWD环境变量获取当前工作目录
root_dir = os.getenv("PWD")

-- 如果PWD不存在或为空，尝试使用HOME环境变量
if not root_dir or root_dir == "" then
    root_dir = os.getenv("HOME")
end

-- 如果仍然没有根目录，设置为当前脚本所在目录（作为最后的备选方案）
if not root_dir or root_dir == "" then
    local script_path = debug.getinfo(1, "S").source:sub(2) -- 移除@前缀
    script_path = normalize_path(script_path)
    root_dir = script_path:match("(.*)/program/")
    
    -- 如果所有尝试都失败，显示错误并退出
    if not root_dir then
        print("错误: 无法获取根目录路径")
        return 1
    end
end

-- 规范化根目录路径
root_dir = normalize_path(root_dir)

-- 日志文件模式列表（使用Lua模式匹配语法）
local log_patterns = {
    "%.log$",      -- 匹配以.log结尾的文件
    "%.log%.",     -- 匹配包含.log.的文件（如.log.1, .log.old等）
    "%.old$",      -- 匹配以.old结尾的文件
    "%.bak$"       -- 匹配以.bak结尾的文件
}

-- 要排除的目录
local exclude_dirs = {
    "node_modules",
    "git",
    "tmp",
    "cache",
    "vendor",
    "deps",
    "lib",
    "bin",
    "obj",
    "build"
}

-- 检查路径是否应被排除
local function should_exclude(path)
    -- 由于我们已经在normalize_path函数中将所有路径转换为正斜杠格式
    -- 所以这里直接使用正斜杠来检查路径
    for _, dir in ipairs(exclude_dirs) do
        -- 检查路径中是否包含排除的目录名，前后有正斜杠
        local pattern = "/"..dir.."/"
        if string.find(path, pattern) then
            return true
        end
    end
    return false
end

-- 递归遍历目录并删除日志文件
local function clean_logs(dir)
    local files_count = 0
    local deleted_count = 0
    local failed_count = 0
    local failed_files = {}    
    local all_files_count = 0

    -- 使用find命令查找文件（兼容Windows SH环境）
    -- 只需要将反斜杠转换为正斜杠，保持Windows风格路径（如K:/winkit/root）
    local normalized_dir = normalize_path(dir)
    local cmd = string.format('find "%s" -type f', normalized_dir)
    print("执行命令: " .. cmd)
    local handle = io.popen(cmd)
    if handle then
        for file in handle:lines() do
            file = normalize_path(file)
            
            all_files_count = all_files_count + 1
            
            -- 检查是否应排除此路径
            local excluded = should_exclude(file)
            
            if not excluded then
                -- 检查文件是否匹配任一日志模式
                local is_log_file = false
                for _, pattern in ipairs(log_patterns) do
                    -- 直接使用模式匹配，无需额外转换
                    if file:lower():match(pattern) then
                        is_log_file = true
                        break
                    end
                end
                
                if is_log_file then
                    files_count = files_count + 1
                    print("找到日志文件: "..file)
                    
                    -- 在SH环境中，os.remove可能需要Windows风格路径
                    -- 保持原样即可，因为find命令返回的路径格式已经可以被os.remove接受
                    -- 如果确实需要转换，只需要将正斜杠转换为反斜杠
                    local windows_path = file:gsub("/", "\\")
                    
                    print("转换后路径: "..windows_path)
                    
                    -- 尝试删除文件
                    local ok, err = os.remove(windows_path)
                    if ok then
                        deleted_count = deleted_count + 1
                        print("成功删除: "..windows_path)
                    else
                        failed_count = failed_count + 1
                        table.insert(failed_files, {file = file, error = err})
                    end
                end
            end
        end
        handle:close()
    end

    -- 调试: 显示文件统计信息
    print(string.format("目录 %s 统计: 总文件数=%d, 日志文件数=%d", dir, all_files_count, files_count))
    
    return files_count, deleted_count, failed_count, failed_files
end

-- 主函数
local function main()
    print("开始清理日志文件...")
    print("指定目录: "..root_dir)
    print("----------------------------------------")

    -- 清理主目录下的日志文件
    local files_count, deleted_count, failed_count, failed_files = clean_logs(root_dir)

    -- 确定正确的根目录 - 兼容SH和Git Bash环境
    local actual_root = root_dir
    -- 如果root_dir包含program目录，说明我们已经在program目录中，需要回退到上一级
    if actual_root:match("/program/?$") then
        actual_root = actual_root:match("(.*)/program/?$")
    end

    -- 额外清理NVIM相关目录
    local nvim_dirs = {
        actual_root.."/program/nvim-win64",
        actual_root.."/files/sim",
        actual_root.."/files/starter",
        actual_root.."/files/repos"
    }

    for _, dir in ipairs(nvim_dirs) do
        print("\n清理NVIM相关目录: "..dir)
        local sub_files, sub_deleted, sub_failed, sub_failed_files = clean_logs(dir)
        files_count = files_count + sub_files
        deleted_count = deleted_count + sub_deleted
        failed_count = failed_count + sub_failed
        for _, file_info in ipairs(sub_failed_files) do
            table.insert(failed_files, file_info)
        end
    end

    -- 显示结果
    print("\n----------------------------------------")
    print("日志文件清理完成！")
    print("总计找到: "..files_count.." 个日志文件")
    print("成功删除: "..deleted_count.." 个日志文件")
    
    if failed_count > 0 then
        print("删除失败: "..failed_count.." 个日志文件")
        for _, file_info in ipairs(failed_files) do
            print("  - "..file_info.file..": "..file_info.error)
        end
    end

    return 0
end

-- 运行主函数
os.exit(main())
